package jp.seraph.jsade.perceptor;

import jp.seraph.jsade.util.GeometoryUtil;

import org.apache.commons.math.geometry.Vector3D;

/**
 * プレイヤーのパーツの名前と位置を保持するオブジェクト
 */
public class SeePartObject {
    public SeePartObject(String aName, double aDistance, double aHorizontalAngle, double aLatitudalAngle){
        mName = aName;

        mDistance = aDistance;
        mHorizontalAngle = aHorizontalAngle;
        mLatitudalAngle = aLatitudalAngle;

        double tRadHorizontal = GeometoryUtil.degreeToRad(aHorizontalAngle);
        double tRadLatitudal = GeometoryUtil.degreeToRad(aLatitudalAngle);
        double tX = aDistance * Math.cos(tRadLatitudal) * Math.cos(tRadHorizontal);
        double tY = aDistance * Math.cos(tRadLatitudal) * Math.sin(tRadHorizontal);
        double tZ = aDistance * Math.sin(tRadLatitudal);
        mVector = new Vector3D(tX, tY, tZ);
    }

    public SeePartObject(String aName, Vector3D aVector){
        mName = aName;
        mDistance = aVector.getNorm();
        mVector = aVector;

        double tRadLatitudal = Math.asin(mVector.getZ() / mDistance);
        double tRadHorizontal = Math.asin(mVector.getY() / (mDistance * Math.cos(tRadLatitudal)));

        mHorizontalAngle = GeometoryUtil.radToDegree(tRadHorizontal);
        mLatitudalAngle = GeometoryUtil.radToDegree(tRadLatitudal);
    }

    private String mName;
    private Vector3D mVector;
    private double mDistance;
    private double mHorizontalAngle;
    private double mLatitudalAngle;

    public String getName(){
        return mName;
    }

    public Vector3D getVecotr(){
        return mVector;
    }

    /**
     * 主観とこのオブジェクトの距離を返す。
     *
     * @return
     */
    public double getDistance() {
        return mDistance;
    }

    /**
     * 主観とこのオブジェクトの相対水平方向角度[°]を返す。 前方が0° 左回転方向が正である。
     *
     * @return
     */
    public double getHorizontalAngle() {
        return mHorizontalAngle;
    }

    /**
     * 主観とこのオブジェクトの相対垂直角度[°]を返す。 水平面方向が0° 上方が正である。
     *
     * @return
     */
    public double getLatitudalAngle() {
        return mLatitudalAngle;
    }
}
